package creational.singleton;

/**
 * @ClassName: DoubleCheckLockSingleton
 * @Description: 双重检查锁（Double Check Locking）
 * @Author: liu-hao
 * @Date: 2023-03-27 21:44
 * @Version: 1.0
 **/
public class DoubleCheckLockSingleton {

    // volatile可以在对象创建时防止指令重排，多线程访问时报错
    private static volatile DoubleCheckLockSingleton instance;

    private DoubleCheckLockSingleton() {
        // 防止通过反射进行实例化（注意，此方式不严谨，反射可以修改单例对象引用）
        if (instance != null) {
            throw new IllegalStateException("单例对象已经初始化！");
        }
    }

    public static DoubleCheckLockSingleton getInstance() {
        // 第一次判断：方式重复获取释放锁造成资源浪费
        if (instance == null) {
            synchronized (DoubleCheckLockSingleton.class) {
                // 第二次判断：防止多线程调用是时重复创建对象
                if (instance == null) {
                    instance = new DoubleCheckLockSingleton();
                }
            }
        }
        return instance;
    }

}
